# -*- coding: utf-8 -*-
'''
@author: Ricardo Faria 6315 e Luís Freitas 5602
@date: 3 Dezembro de 2012
Esta classe contem os métodos que efectuam as querys
consultando a base de dados
Os as pesquisas foram efectuadas com sqlalchemy
'''
import sqlalchemy
from sqlalchemy import *
import csv

database = create_engine('sqlite:///dados.sqlite3')
metadata = MetaData(database)
insc = Table('dados', metadata, autoload = True)
years = ['95-96', '96-97', '97-98', '98-99', '99-00', '00-01', '01-02', '02-03', '03-04', '04-05','05-06', '06-07', '07-08', '08-09', '09-10', '10-11']
#O array list_years serve para enviar para a primeira linha do csv
list_years = ['Anos:', '95-96', '96-97', '97-98', '98-99',
             '99-00', '00-01', '01-02', '02-03', '03-04', '04-05',
             '05-06', '06-07', '07-08', '08-09', '09-10', '10-11']

'''
métodos que selecciona as linhas que no curso contem a palavra
informática ou computadores
de seguida cria uma lista con o curso, estabelecimento, unidade organica e na
ultima posição da lista encontram-se os anos em que foram frequentados
'''
def consulta():   
    result = insc.select(or_(insc.c.curso.like(u'%informática%'), insc.c.curso.like(u'%computadores%')))
    rs = result.execute()
    lista = []
    wr = csv.writer(open("pesquisa1.csv", "wb"))
    for row in rs:
       #para cada linha que contem as palvras 
       lista.append(row[3].encode('utf-8'))
       lista.append(row[0].encode('utf-8'))
       lista.append(row[1].encode('utf-8'))
       string_years = ""
       
       for x in range(5, 16):
           #dentro de cada linha verificamos os anos que foram frequentados
           if not row[x] == "-":
               string_years += years[x - 5]
               #x-5 para corresponder à posição correcta no array dos anos
               # e assim obter os anos correcto do array
               string_years += ";"

       lista.append(string_years)    
       wr.writerow(lista)
       lista = []

'''
Método que pesquisa os cursos com os termos computadores e informática
com o nr de alunos ao longo dos anos
Finalmente coloca os dados num csv
'''
def consulta2():
    result = insc.select(or_(insc.c.curso.like(u'%informática%'), insc.c.curso.like(u'%computadores%')))
    rs = result.execute()
    lista = []
    wr = csv.writer(open("pesquisa2.csv", "wb"))
    
    wr.writerow(list_years)
    for row in rs:
        string = row[3].encode('utf-8') + ": " + row[0].encode('utf-8')
        #no ficheiro csv irá ficar o nome do curso juntamente com
        #o seu estabelecimento
        lista.append(string)
        for x in range(5, 16):#5 = posiçao que começam os anos; 16 ultima posiço
            if not row[x] == "-":
                lista.append(row[x])
        wr.writerow(lista)
        lista = []
'''
Método que calcula a quantidade de cursos por nivel de formaçao
'''
def consulta3():
    result = insc.select()
    rs = result.execute()
    wr = csv.writer(open("pesquisa3.csv", "wb"))
    lista_repetida = []
    lista_sem_repeticao = []#contem os niveis de formaçao
    nivel_quantidade = []
    c = 0
    for row in rs:
        #criar uma lista com dados repetidos para posteriormente contar
        lista_repetida.append(row[2].encode('utf-8'))
        #criar uma lista sem dados repetidos
        if not row[2].encode('utf-8') in lista_sem_repeticao:
            lista_sem_repeticao.append(row[2].encode('utf-8'))            

    #contar numeros de cursos por nivel de formaçao
    for element in lista_sem_repeticao:    
        for el in lista_repetida:
            if element == el:
                c+=1
        nivel_quantidade.append(element)
        nivel_quantidade.append(c)
        c = 0
        wr.writerow(nivel_quantidade)
        nivel_quantidade = []
'''
Método que pesquisa a quantidade de alunos por nivel de formaçºao ao longo dos anos
'''
def consulta4():
    
    result = insc.select()
    rs = result.execute()
    wr = csv.writer(open("pesquisa4.csv", "wb"))
    wr.writerow(list_years)
    lista_niveis = []
    for row in rs:
        if not row[2].encode('utf-8') in lista_niveis:
            lista_niveis.append(row[2].encode('utf-8'))


    for x in range(len(lista_niveis)):
        result = insc.select(and_(insc.c.nivel == lista_niveis[x].decode('utf-8')))
        rs = result.execute()
        y = 0
        niveis_counter = ['', 0, 0, 0, 0,
             0, 0, 0, 0, 0, 0,
             0, 0, 0, 0, 0, 0]
        niveis_counter[0] = lista_niveis[x]


        for row in rs:
            if row[5] != '-' and row[6] != '-' and row[8] != '-' and row[9] != '-' and row[10] != '-' and row[11] != '-' and row[12] != '-' and row[13] != '-' and row[14] != '-' and row[15] != '-' and row[16] != '-' and row[17] != '-' and row[18] != '-' and row[19] != '-' and row[20] != '-':
                niveis_counter[1] += float(row[5])
                niveis_counter[2] += float(row[6])
                niveis_counter[3] += float(row[7])
                niveis_counter[4] += float(row[8])
                niveis_counter[5] += float(row[9])
                niveis_counter[6] += float(row[10])
                niveis_counter[7] += float(row[11])
                niveis_counter[8] += float(row[12])
                niveis_counter[9] += float(row[13])
                niveis_counter[10] += float(row[14])
                niveis_counter[11] += float(row[15])
                niveis_counter[12] += float(row[16])
                niveis_counter[13] += float(row[17])
                niveis_counter[14] += float(row[18])
                niveis_counter[15] += float(row[19])
                niveis_counter[16] += float(row[20])
        wr.writerow(niveis_counter)
        niveis_counter = []

'''
Método que vai buscar a lista a introduzir na listbox caso
a consulta seja o numero de alunos por curso
'''
def consulta_adicional():
    ficheiro = open("pesquisa2.csv")
    lista = []
    for line in ficheiro:
       lista_retirar =  line.split(',')
       lista.append(lista_retirar[0])
    del lista[0]
       
    return lista

'''
Método que vai buscar a lista a introduzir na listbox caso
a consulta seja o numero de alunos por nivel de formação
'''
def consulta_adicional2():
    ficheiro = open("pesquisa4.csv")
    lista = []
    for line in ficheiro:
       lista_retirar =  line.split(',')
       lista.append(lista_retirar[0])
    del lista[0]
       
    return lista


consulta()
consulta2()
consulta3()
consulta4()

